home *** CD-ROM | disk | FTP | other *** search
Text File | 1993-09-16 | 6.0 KB | 168 lines | [TEXT/CCL2] |
- ; 411 reader. Read the 411 MPW files & extract the register trap info.
- ;
- ; Joe Chung, Apple Computers 7/90
- ;
-
- ;;;;;;;;;;;;
- ;;
- ;; Modification history
- ;;
- ;; 01/02/92 bill don't (ccl:require :stream-read-line)
- ;; 12/19/91 bill stream-read-line -> read-line
- ;; don't expect (fboundp ccl::old-trap-macro-function) to be true.
- ;;
-
- (in-package :translate)
-
- (defvar *register-trap-table* (make-hash-table :test #'eq))
- (defstruct rtrap
- number
- entry
- exit)
-
- (defvar *411-readtable* (copy-readtable nil))
-
- (defun 411-read-self (stream char)
- (declare (ignore stream))
- char)
-
- (defun 411-read-hex (stream char)
- (declare (ignore char))
- (let ((*read-base* 16))
- (read stream)))
-
- (set-syntax-from-char #\# #\a *411-readtable* *readtable*)
- (set-syntax-from-char #\, #\space *411-readtable* *readtable*)
- (set-syntax-from-char #\. #\space *411-readtable* *readtable*)
- (set-syntax-from-char #\` #\space *411-readtable* *readtable*)
- (set-syntax-from-char #\( #\space *411-readtable* *readtable*)
- (set-syntax-from-char #\) #\space *411-readtable* *readtable*)
- (set-syntax-from-char #\' #\" *411-readtable* *readtable*)
- (set-macro-character #\$ '411-read-hex nil *411-readtable*)
- (set-macro-character #\; '411-read-self nil *411-readtable*)
- (set-macro-character #\: '411-read-self nil *411-readtable*)
- (set-macro-character #\newline '411-read-self nil *411-readtable*)
-
- (defun dial-411
- (&key (input-path (ccl::choose-file-dialog :button-string "dial")))
- (with-open-file (istream input-path :direction :input)
- (let ((*readtable* *411-readtable*)
- (*package* (find-package :translate)))
- (do ((line (read-line istream nil nil)
- (read-line istream nil nil))
- trap-name
- old-trap-mf)
- ((null line))
- (when (> (length line) 14)
- (let ((first-six (subseq line 0 6)))
- (cond ((string= first-six "æD FUN")
- (setq trap-name
- (subseq line 12 (or
- (position #\( line :start 13)
- (position #\: line :start 13)))))
- ((string= first-six "æD PRO")
- (setq trap-name (subseq line 13
- (or
- (position #\( line :start 14)
- (position #\: line :start 14)))))
- (t
- (setq trap-name nil))))
- (when trap-name
- (let ((trap-number (find-trap-number trap-name))
- entry-registers exit-registers)
- (when (and trap-number (or (< trap-number #xa800)
- (and (setq old-trap-mf
- (old-trap-macro-function trap-name))
- (eq old-trap-mf
- (fboundp 'ccl::register-trap-macro-function)))))
- (do ((token (read istream) (read istream)))
- ((eq token 'on)))
- (when (eq (read istream) 'entry)
- (setq entry-registers (read-entry-registers istream)))
- (setq exit-registers (read-exit-registers istream))
- (setf (gethash (intern (string-upcase trap-name))
- *register-trap-table*)
- (make-rtrap :number trap-number
- :entry entry-registers
- :exit exit-registers))))))))))
-
- (defun find-trap-number (name)
- (let ((symbol (find-symbol (concatenate 'string "_" (string-upcase name))
- :translate*)))
- (and symbol (boundp symbol) (symbol-value symbol))))
-
- (defun old-trap-macro-function (name)
- (let ((symbol (find-symbol (concatenate 'string "_" (string-upcase name))
- :ccl)))
- (and symbol (fboundp symbol) (car (symbol-function symbol)))))
-
- (defun read-entry-registers (istream &aux result)
- (loop
- (let ((register (read istream)))
- (case register
- ((d0 d1 d2 a0 a1)
- (read istream) ; get rid of :
- (push `(,(ccl::make-keyword register)
- ,(read-delimited-list #\newline istream))
- result))
- (on
- (when (eq (read istream) 'exit)
- (return)))
- (|æKY|
- (return))
- ((#\: #\newline))
- (t
- (read-line istream)))))
- (nreverse result))
-
-
- (defun read-exit-registers (istream &aux result)
- (loop
- (let ((register (read istream)))
- (case register
- ((d0 d1 d2 a0 a1)
- (read istream) ; get rid of :
- (push `(,(ccl::make-keyword register)
- ,(read-delimited-list #\newline istream))
- result))
- ((|æKY| #\newline)
- (return))
- (#\:)
- (t
- (read-line istream)))))
- (nreverse result))
-
- ; Make this stuff fast to get at.
- (defun dump-411-traps (&optional (file (ccl::choose-new-file-dialog)))
- (with-open-file (stream file :direction :output :if-exists :supersede)
- (format stream "(in-package :translate)~%")
- (let ((f #'(lambda (key value)
- (dump-trap key value stream))))
- (declare (dynamic-extent f))
- (maphash f *register-trap-table*))))
-
- (defvar *translate-package* (find-package :translate))
-
- (defmacro def-411-trap (name &key number entry exit)
- `(%def-411-trap ',name :number ,number :entry ,entry :exit ,exit))
-
- (defun %def-411-trap (name &key number entry exit)
- (setf (gethash name *register-trap-table*)
- (make-rtrap :number number
- :entry entry
- :exit exit))
- name)
-
- (defun dump-trap (key value stream)
- (let ((*print-case* :downcase)
- (*print-pretty* t)
- (*package* *translate-package*))
- (print `(def-411-trap ,key
- :number ',(rtrap-number value)
- :entry ',(rtrap-entry value)
- :exit ',(rtrap-exit value))
- stream)
- (write-char #\newline stream)))
-
-
-